import { ajax } from "./utils/ajax"

/**
 * 加载Obj模型数据
 * @param {WebGL Object} gl WebGL 对象
 * @param {String} url  Obj模型Url
 * @param {Function} callback 回调函数
 */
function loadObj(gl, url, callback){
    ajax(url, {}, function(data){
        var obj = _parseObjStr(data);
        callback(obj);
    })
}
/**
 * 解析Obj模型数据
 * @param {String} objStr Obj模型数据
 */
function _parseObjStr(objStr){
    var vertexArray = new Array();      // 原始顶点数组
    var vertexArrayRes = [];            // 结果顶点数组,根据索引值计算
    var textureArray = new Array();     // 原始纹理坐标数组
    var textureArrayRes = [];           // 结果纹理坐标数组，根据索引值计算
    var vertexNormalArray = new Array();// 原始顶点法向量数组
    var vertexNormalArrayRes = [];      // 结果顶点法向量数组，根据索引值计算
    var lines = objStr.split("\n");
    //console.log(lines);
    for(var lineIndex in lines){
        //console.log(lines[lineIndex]);
        try{
            var line = lines[lineIndex].replace(/[ \t]+/g," ").replace(/\s\s*$/, "");
        }catch(ex){
            debugger
            console.log(lineIndex + ":" +lines[lineIndex]);
        }
        if(line[0] === "#"){
            continue;
        }
        var array = line.split(" ");
        //console.log(array);
        switch(array[0]){
            case "v":                   // 顶点坐标     v x y z
                vertexArray.push(parseFloat(array[1]),
                                 parseFloat(array[2]),
                                 parseFloat(array[3]));
            break
            case "vt":  // 顶点纹理坐标  vt S T P
                textureArray.push(parseFloat(array[1]),
                                  1-parseFloat(array[2]),   // 倒置转换T轴
                                  parseFloat(array[3]));
            break
            case "vn": // 顶点法向量
                vertexNormalArray.push(parseFloat(array[1]),
                                       parseFloat(array[2]),
                                       parseFloat(array[3]));
            break
            case "f":                   // 面          f 顶点数据索引 顶点纹理坐标数据索引 顶点法向量数据索引
                if(array.length < 4){
                    console.log(array);
                    console.log("数组长度不为4!");
                    continue;
                }
                for(var i=1;i<4;i++){
                    var tempArr = array[i].split("/");

                    var vIndex = tempArr[0]-1;  // 顶点数组索引
                    vertexArrayRes.push(vertexArray[vIndex*3 + 0],
                                        vertexArray[vIndex*3 + 1],
                                        vertexArray[vIndex*3 + 2]);

                    if(tempArr.length >= 2){
                        var vtIndex = tempArr[1]-1;  // 纹理坐标数组索引
                        textureArrayRes.push(textureArray[vtIndex*3 + 0],
                                             textureArray[vtIndex*3 + 1]);
                    }

                    if(tempArr.length === 3){
                        var vnIndex = tempArr[2]-1;  // 法向量数组索引
                        vertexNormalArrayRes.push(vertexNormalArray[vnIndex*3 + 0],
                                                  vertexNormalArray[vnIndex*3 + 1],
                                                  vertexNormalArray[vnIndex*3 + 2]);
                    }
                }
            break
            default :
                continue
        }
    }
    return {
        vertexArrayRes,
        textureArrayRes,
        vertexNormalArrayRes
    };

}
export { loadObj };